package com.ghyf.mplay.view;

import com.ghyf.mplay.WeakHandler;
import com.ghyf.mplay.datatype.DateParam;
import com.ghyf.mplay.datatype.FontParam;
import com.ghyf.mplay.datatype.MDShow;
import com.ghyf.mplay.datatype.RGBA;
import com.ghyf.mplay.datatype.ShowLang;
import com.ghyf.mplay.datatype.YearShow;
import com.ghyf.mplay.util.LogUtil;
import com.ghyf.mplay.util.MTypefaceSpan;
import com.ghyf.mplay.util.TypeFaceFactory;

import android.content.Context;
import android.graphics.Color;
import android.graphics.Typeface;
import android.os.Handler;
import android.os.Message;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.format.Time;
import android.text.style.AbsoluteSizeSpan;
import android.text.style.ForegroundColorSpan;
import android.widget.TextView;

/**
 * 显示日期的控件
 * @author 陈小红
 *
 */
public class MDate extends TextView {
	private static final String TAG="MDate";
	
	private int module_type; // 模块类型
	
	private int zOrder; // 模块的ZOrder
	
	private String file_version;	//文件版本
	
	private String module_name;	//控件名
	
	private int module_uid;//控件标识
	
	private int module_gid;//控件组标识
	
	// <Show_Date>1</Show_Date>
	private boolean show_date;// 是否显示

	// <Date_Lang>1</Date_Lang>
	private ShowLang Date_Lang;// 显示日期的语言

	// <Date_Param Show_Seq="0" Year_Show="4" MD_Show="1"
	// Year_Tip="年" Month_Tip="月" Day_Tip="日" />
	private DateParam date_param; // 日期显示格式。

	// <Date_Font Name="宋体" Size="40" Width="0" Escapement="0" Orientation="0"
	// Kerning="0" Spacing="0" Bold="0" Italic="0" Underline="0"
	// FaceColor="(0,0,0,255)" EdgeWidth="0" EdgeColor="(0,0,0,255)"
	// ShadowWidth="0" ShadowColor="(0,0,0,255)" ShadowAngle="0" />
	private FontParam date_font;// 日期字体

	// <Show_Week>1</Show_Week>
	private boolean show_week;// 是否显示星期

	// <Week_Lang>1</Week_Lang>
	private ShowLang week_lang;// 显示星期的语言

	// <Week_Font Name="宋体" Size="40" Width="0" Escapement="0" Orientation="0"
	// Kerning="0" Spacing="0" Bold="0" Italic="0" Underline="0"
	// FaceColor="(0,0,0,255)" EdgeWidth="0" EdgeColor="(0,0,0,255)"
	// ShadowWidth="0" ShadowColor="(0,0,0,255)" ShadowAngle="0" />
	private FontParam week_font;// 显示星期的字体。

	private MDate mDate;

	private Thread myThread;
	private Time time;
	
	
	
	 private final Handler handler = new DateHandler(this);
	 
	 
	 private static class DateHandler extends WeakHandler<MDate> {
		 private SpannableString spanStr=null;
		 MDate activity=null;
		   public DateHandler(MDate owner) {
	            super(owner);
	        }
	        @Override
			public void handleMessage(Message msg) {
	        	 activity = getOwner();
	        	if(activity == null) return;
	        	// Show_Date>1</Show_Date>
				if (activity.show_date && activity.show_week) { // 日期、星期都显示
					 spanStr = new SpannableString(activity.dateStr + activity.weekStr);
					// 日期字符串的大小，字体，颜色
					activity.initSpanFont(spanStr, activity.date_font, 0, activity.dateStr.length());
					// 星期字符串的大小，字体，颜色
					activity.initSpanFont(spanStr, activity.week_font, activity.dateStr.length(),
							activity.dateStr.length() + activity.weekStr.length());
					activity.mDate.setText(spanStr);
				} else if (!activity.show_date && activity.show_week) { // 只显示星期
					activity.setTextFont(activity.mDate, activity.week_font, activity.weekStr);
				} else if (activity.show_date && !activity.show_week) { // 只显示日期
					activity.setTextFont(activity.mDate, activity.date_font, activity.dateStr);
				}
				
				super.handleMessage(msg);
			}
	 }
	

	/**
	 * 得到当前星期日期的线程
	 */
	private Runnable myRunnable = new Runnable() {
		@Override
		public void run() {
			while (!myThread.isInterrupted()) {
				time = new Time();
				time.set(System.currentTimeMillis());
				weekStr = getWeekStr(time);
				dateStr = getDateStr(time);
				handler.sendEmptyMessage(0);
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					LogUtil.i(TAG, "Thread.sleep...\r\n" + e);
				}
			}
		}
	};

	
	/**
	 * 当控件显示时自动执行
	 */
	@Override
	protected void onAttachedToWindow() {
		YearTip = date_param.getYear_tip();
		monthTip = date_param.getMonth_tip();
		DayTip = date_param.getDay_tip();
		myThread = new Thread(myRunnable);
		myThread.start();
		super.onAttachedToWindow();
	}

	
	/**
	 * 当控件从界面退出时自动执行
	 */
	@Override
	protected void onDetachedFromWindow() {
		myThread.interrupt();
		super.onDetachedFromWindow();
	}

	/**
	 * 设置TextView的文本和字体
	 * 
	 * @param tv
	 *            textview控件
	 * @param font
	 *            文本的字体
	 * @param text
	 *            文本
	 */
	void setTextFont(TextView tv, FontParam font, String text) {
		tv.setText(text);
		// 大小
		tv.setTextSize(font.getSize());
		// 字体
		Typeface typeface = TypeFaceFactory.createTypeface(font.getName());
		tv.setTypeface(typeface);
		// 颜色
		RGBA rgba = font.getFaceColor();
		int color = Color.argb(rgba.getAlpha(), rgba.getRed(), rgba.getGreen(),
				rgba.getBlue());
		tv.setTextColor(color);
	}

	/**
	 * 设置扩展文本的字体，如大小，字体，颜色……
	 * 
	 * @param spanStr
	 *            扩展文本
	 * @param font
	 *            字体
	 * @param start
	 *            扩展文本的起始位置
	 * @param end
	 *            扩展文本的结束位置
	 */
	void initSpanFont(SpannableString spanStr, FontParam font, int start,
			int end) {
		// 设置大小
		spanStr.setSpan(new AbsoluteSizeSpan(font.getSize()), start, end,
				Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
		// 设置字体
		Typeface typeface = TypeFaceFactory.createTypeface(font.getName());
		spanStr.setSpan(new MTypefaceSpan("sdifojao", typeface), start, end,
				Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
		// 设置颜色
		RGBA rgba = font.getFaceColor();
		int color = Color.argb(rgba.getAlpha(), rgba.getRed(), rgba.getGreen(),
				rgba.getBlue());
		spanStr.setSpan(new ForegroundColorSpan(color), start, end,
				Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

		// TODO 字体的其它设置
	}

	/**
	 * 得到星期的显示字符串。
	 * 
	 * @param time
	 *            当前时间值对象
	 * @return
	 */
	String getWeekStr(Time time) {
		if (week_lang == ShowLang.CHINESE) { // 星期为中文显示
			switch (time.weekDay) {
			case 0:
				weekStr = "星期日";
				break;
			case 1:
				weekStr = "星期一";
				break;
			case 2:
				weekStr = "星期二";

				break;
			case 3:

				weekStr = "星期三";
				break;
			case 4:

				weekStr = "星期四";
				break;
			case 5:
				weekStr = "星期五";
				break;
			case 6:
				weekStr = "星期六";
				break;
			default:
				break;
			}
		} else if (week_lang == ShowLang.ENGLISH) { // 星期为英文显示
			switch (time.weekDay) {
			case 0:
				weekStr = "SUNDAY";
				break;
			case 1:
				weekStr = "MONDAY";
				break;
			case 2:
				weekStr = "TUESDAY";

				break;
			case 3:

				weekStr = "WEDNESDAY";
				break;
			case 4:

				weekStr = "THURSDAY";
				break;
			case 5:
				weekStr = "FRIDAY";
				break;
			case 6:
				weekStr = "SATURDAY";
				break;
			default:
				
				weekStr = "SUNDAY";
				break;
			}
		}
		return weekStr;
	}
	String weekStr;
	String dateStr = ""; // 日期字符串格式
	String yearStr = ""; // 年字符串格式
	String monthStr = ""; // 月字符串格式
	String dayStr = ""; // 日字符串格式
	String YearTip = "";
	String monthTip = "";
	String DayTip = "";
	/**
	 * 得到日期的显示字符串。
	 * 
	 * @param time
	 *            当前时间值对象
	 * @return
	 */
	String getDateStr(Time time) {
	
		if (date_param.getYear_show() == YearShow.NOTSHOW) { // 不显示年
			YearTip = ""; // 不显示年，所以不显示年的tip
			yearStr = "";
			monthStr = String.valueOf((time.month + 1));
			dayStr = String.valueOf(time.monthDay);
			if (date_param.getMD_Show() == MDShow.NOZERO) { // 月日不加零
				switch (date_param.getShow_seq()) {
				case YMD: // 年月日
					// 最终得到的日期字符串格式。
					dateStr = yearStr + YearTip + monthStr + monthTip + dayStr
							+ DayTip;
					break;
				case MDY: // 月日年
					dateStr = monthStr + monthTip + dayStr + DayTip + yearStr
							+ YearTip;
					break;
				case DMY: // 日月年
					dateStr = dayStr + DayTip + monthStr + monthTip + yearStr
							+ YearTip;
					break;
				}

			} else { // 月日前加零
				if (time.month < 9) { // 当月数小于10时前面加0。
					monthStr = "0" + String.valueOf((time.month + 1));
				}
				if (time.monthDay < 10) { // 当月数小于10时前面加0。
					dayStr = "0" + String.valueOf(time.monthDay);
				}
				switch (date_param.getShow_seq()) {
				case YMD: // 年月日
					// 最终得到的日期字符串格式。
					dateStr = yearStr + YearTip + monthStr + monthTip + dayStr
							+ DayTip;
					break;
				case MDY: // 月日年
					dateStr = monthStr + monthTip + dayStr + DayTip + yearStr
							+ YearTip;
					break;
				case DMY: // 日月年
					dateStr = dayStr + DayTip + monthStr + monthTip + yearStr
							+ YearTip;
					break;
				}
			}

		} else if (date_param.getYear_show() == YearShow.SHOWTWO) { // 年显示两位
			yearStr = String.valueOf(time.year % 100);
			monthStr = String.valueOf((time.month + 1));
			dayStr = String.valueOf(time.monthDay);
			if (date_param.getMD_Show() == MDShow.NOZERO) { // 月日不加零
				switch (date_param.getShow_seq()) {
				case YMD: // 年月日
					// 最终得到的日期字符串格式。
					dateStr = yearStr + YearTip + monthStr + monthTip + dayStr
							+ DayTip;
					break;
				case MDY: // 月日年
					dateStr = monthStr + monthTip + dayStr + DayTip + yearStr
							+ YearTip;
					break;
				case DMY: // 日月年
					dateStr = dayStr + DayTip + monthStr + monthTip + yearStr
							+ YearTip;
					break;
				}

			} else { // 月日前加零
				if (time.month < 9) { // 当月数小于10时前面加0。
					monthStr = "0" + String.valueOf((time.month + 1));
				}
				if (time.monthDay < 10) { // 当月数小于10时前面加0。
					dayStr = "0" + String.valueOf(time.monthDay);
				}
				switch (date_param.getShow_seq()) {
				case YMD: // 年月日
					// 最终得到的日期字符串格式。
					dateStr = yearStr + YearTip + monthStr + monthTip + dayStr
							+ DayTip;
					break;
				case MDY: // 月日年
					dateStr = monthStr + monthTip + dayStr + DayTip + yearStr
							+ YearTip;
					break;
				case DMY: // 日月年
					dateStr = dayStr + DayTip + monthStr + monthTip + yearStr
							+ YearTip;
					break;
				}
			}
		} else if (date_param.getYear_show() == YearShow.SHOWFOUR) { // 年显示四位
			yearStr = String.valueOf(time.year);
			monthStr = String.valueOf((time.month + 1));
			dayStr = String.valueOf(time.monthDay);
			if (date_param.getMD_Show() == MDShow.NOZERO) { // 月日不加零
				switch (date_param.getShow_seq()) {
				case YMD: // 年月日
					// 最终得到的日期字符串格式。
					dateStr = yearStr + YearTip + monthStr + monthTip + dayStr
							+ DayTip;
					break;
				case MDY: // 月日年
					dateStr = monthStr + monthTip + dayStr + DayTip + yearStr
							+ YearTip;
					break;
				case DMY: // 日月年
					dateStr = dayStr + DayTip + monthStr + monthTip + yearStr
							+ YearTip;
					break;
				}

			} else { // 月日前加零
				if (time.month < 9) { // 当月数小于10时前面加0。
					monthStr = "0" + String.valueOf((time.month + 1));
				}
				if (time.monthDay < 10) { // 当月数小于10时前面加0。
					dayStr = "0" + String.valueOf(time.monthDay);
				}
				switch (date_param.getShow_seq()) {
				case YMD: // 年月日
					// 最终得到的日期字符串格式。
					dateStr = yearStr + YearTip + monthStr + monthTip + dayStr
							+ DayTip;
					break;
				case MDY: // 月日年
					dateStr = monthStr + monthTip + dayStr + DayTip + yearStr
							+ YearTip;
					break;
				case DMY: // 日月年
					dateStr = dayStr + DayTip + monthStr + monthTip + yearStr
							+ YearTip;
					break;
				}
			}
		}
		return dateStr;
	}

	public boolean isShow_date() {
		return show_date;
	}

	public void setShow_date(boolean show_date) {
		this.show_date = show_date;
	}

	public ShowLang getDate_Lang() {
		return Date_Lang;
	}

	public void setDate_Lang(ShowLang date_Lang) {
		Date_Lang = date_Lang;
	}

	public DateParam getDate_param() {
		return date_param;
	}

	public void setDate_param(DateParam date_param) {
		this.date_param = date_param;
	}

	public FontParam getDate_font() {
		return date_font;
	}

	public void setDate_font(FontParam date_font) {
		this.date_font = date_font;
	}

	public boolean isShow_week() {
		return show_week;
	}

	public void setShow_week(boolean show_week) {
		this.show_week = show_week;
	}

	public ShowLang getWeek_lang() {
		return week_lang;
	}

	public void setWeek_lang(ShowLang week_lang) {
		this.week_lang = week_lang;
	}

	public FontParam getWeek_font() {
		return week_font;
	}

	public void setWeek_font(FontParam week_font) {
		this.week_font = week_font;
	}

	public MDate getmDate() {
		return mDate;
	}

	public void setmDate(MDate mDate) {
		this.mDate = mDate;
	}

	public MDate(Context context) {
		super(context);
	}
	
	public int getModule_type() {
		return module_type;
	}

	public void setModule_type(int module_type) {
		this.module_type = module_type;
	}

	public int getzOrder() {
		return zOrder;
	}

	public void setzOrder(int zOrder) {
		this.zOrder = zOrder;
	}

	public String getFile_version() {
		return file_version;
	}

	public void setFile_version(String file_version) {
		this.file_version = file_version;
	}

	public String getModule_name() {
		return module_name;
	}

	public void setModule_name(String module_name) {
		this.module_name = module_name;
	}

	public int getModule_uid() {
		return module_uid;
	}

	public void setModule_uid(int module_uid) {
		this.module_uid = module_uid;
	}

	public int getModule_gid() {
		return module_gid;
	}

	public void setModule_gid(int module_gid) {
		this.module_gid = module_gid;
	}
	

}